home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / interrupt.s < prev    next >
Text File  |  2000-01-23  |  16KB  |  684 lines

  1.     .include    iocscall.mac
  2.     .include    keyconst.equ
  3.     .include    global.mac
  4.  
  5.   .ifndef _LEDCTRL
  6. _LEDCTRL    equ    $06
  7.   .endif
  8.   .ifndef _KEYDLY
  9. _KEYDLY        equ    $08
  10.   .endif
  11.   .ifndef _KEYREP
  12. _KEYREP        equ    $09
  13.   .endif
  14.  
  15. ;----------------------------------------------------------------
  16. ;TRAP#14例外処理ルーチン
  17. ;    白窓が出ても意味がないので無条件に中断する
  18.     .text
  19.     .align    4,$2048
  20. trap14_routine::
  21.     DI
  22.     bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  23.     bsr    do_mute            ;muteする
  24.     st.b    trap14_aborted
  25.     move.w    d7,trap14_d7
  26.     move.l    a5,trap14_a5
  27.     move.w    (a6),trap14_sr        ;SR
  28.     move.l    (2,a6),trap14_pc    ;PC
  29.     move.l    #trap14_sr,trap14_a6    ;スタックは破壊されるのでワークにコピーして使う
  30.     move.w    $0A0E.w,abort_iocs_in_progress
  31.     IOCS    _ABORTRST
  32.     IOCS    _ABORTJOB
  33.     rte                ;ダミー
  34.  
  35.     .data
  36. trap14_aborted::    .dc.b    0
  37.  
  38.     .bss
  39.     .even
  40. trap14_d7:    .ds.w    1
  41. trap14_a5:    .ds.l    1
  42. trap14_a6:    .ds.l    1
  43. trap14_sr:    .ds.w    1
  44. trap14_pc:    .ds.l    1
  45.  
  46. ;----------------------------------------------------------------
  47. ;TRAP#14でアボートしたときのメッセージの表示
  48.     .text
  49.     .align    4,$2048
  50. print_trap14_message::
  51.     lea.l    (m_program_head,pc),a0
  52.     bsr    eprint
  53.     move.l    #program_head,d0
  54.     bsr    h8tos_eprint
  55.     bsr    ecrlf
  56.     move.w    trap14_d7,d7        ;TRAP#14に渡されたd7
  57.     movea.l    trap14_a5,a5        ;TRAP#14に渡されたa5
  58.     movea.l    trap14_a6,a6        ;TRAP#14に渡されたa6
  59.     bsr    get_trap14_message
  60.     bra    eprint
  61.  
  62. m_program_head:    .dc.b    'PROGRAM_HEAD=$',0
  63.     .even
  64.  
  65. ;----------------------------------------------------------------
  66. ;NMI割り込みルーチン
  67.     .text
  68.     .align    4,$2048
  69. nmi_routine::
  70.     DI
  71.     move.b    #$0C,SYS_3        ;NMIリセット
  72. ;ここでTIMERD割り込みを止めないと重すぎて戻れなくなることがある
  73.     bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  74.     bsr    do_mute            ;muteする
  75.   .if NMI_PC
  76.     move.l    (2,sp),nmi_pc
  77.   .endif
  78. nmi_routine_proc:
  79.   .if 0
  80.     sne.b    -(sp)
  81.     st.b    nmi_aborted
  82.     movem.l    d0-d7/a0-a6,-(sp)
  83.     move.w    #$301F,d7
  84.     lea.l    (4*15+2,sp),a6
  85.     trap    #14
  86.     movem.l    (sp)+,d0-d7/a0-a6
  87.     sf.b    nmi_aborted
  88.     tst.b    (sp)+
  89.     beq    @f
  90.     bset.b    #4,IMRB            ;TIMERD割り込み許可
  91. @@:    rte
  92.   .else
  93. ;NMIから復帰しても矩形波の位相がずれてしまうので復帰せずにいきなり中断する
  94.     st.b    nmi_aborted
  95.     move.w    $0A0E.w,abort_iocs_in_progress
  96.     IOCS    _ABORTRST
  97.     IOCS    _ABORTJOB
  98.     rte                ;ダミー
  99.   .endif
  100.  
  101.     .data
  102.     .align    4
  103. nmi_old_vector::    .dc.l    0
  104.  
  105.     .data
  106. nmi_aborted::        .dc.b    0
  107.     .even
  108. abort_iocs_in_progress::    .dc.w    -1
  109.  
  110.     .bss
  111.   .if NMI_PC
  112.     .align    4
  113. nmi_pc:            .ds.l    1
  114.   .endif
  115.  
  116. ;----------------------------------------------------------------
  117. ;POWER OFF割り込みルーチン
  118. ;    TIMERD割り込みを止めてからアボートする
  119. ;    ここではPOWER OFF動作は行わない
  120. ;    (ROMのPOWER OFFルーチンがTIMERCのカウンタを使っているので,
  121. ;    POWER OFF動作を行うならTIMERCのモードを復元しておく必要がある)
  122.     .text
  123.     .align    4,$2048
  124. poweroff_routine::
  125.     DI
  126.     bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  127.     bsr    do_mute            ;muteする
  128.     st.b    poweroff_aborted
  129.     move.w    $0A0E.w,abort_iocs_in_progress
  130.     IOCS    _ABORTRST
  131.     IOCS    _ABORTJOB
  132.     rte                ;ダミー
  133.  
  134.     .data
  135.     .align    4
  136. poweroff_old_vector::    .dc.l    0
  137.  
  138.     .data
  139. poweroff_aborted::    .dc.b    0
  140.  
  141. ;----------------------------------------------------------------
  142. ;キー入力バッファフル割り込みルーチン(extraモードでないとき)
  143. ;    TIMERD割り込みよりもキー入力割り込みの方が強いので
  144. ;    TIMERDが重くてもキー入力で中断できる
  145.     .text
  146.     .align    4,$2048
  147. keyin_full_routine::
  148.     DI
  149.                     ;キー入力割り込みは復帰する場合が多いので,
  150.                     ;最初にTIMERD割り込みを禁止してはならない
  151.     move.l    d0,-(sp)
  152.     move.b    UDR,d0            ;UDRをリード
  153.     cmp.b    #KEY_CODE_F,d0        ;Fならフェードアウト
  154.     beq    6f
  155.     cmp.b    #KEY_CODE_TAB,d0    ;TABならスキップ
  156.     beq    7f
  157.     cmp.b    #KEY_CODE_ESC,d0    ;ESCなら中止
  158.     beq    1f
  159.     cmp.b    #KEY_CODE_Q,d0        ;Qなら中止
  160.     beq    8f
  161.     cmp.b    #KEY_CODE_BREAK,d0    ;BREAKなら強制中止
  162.     beq    2f
  163.     cmp.b    #KEY_CODE_COPY,d0    ;COPYはINTERRUPTとみなす
  164.     beq    15f
  165.     cmp.b    #KEY_CODE_CTRL,d0    ;CTRL down
  166.     beq    3f
  167.     cmp.b    #KEY_CODE_CTRL|$80,d0    ;CTRL up
  168.     beq    4f
  169.     cmp.b    #KEY_CODE_C,d0        ;C
  170.     beq    5f
  171. 99:    move.l    (sp)+,d0
  172.     rte
  173.  
  174. ;ESCが押された
  175. 1:    bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  176.     bsr    do_mute            ;muteする
  177.     st.b    esc_aborted
  178.     bra    99b            ;すぐにはアボートしない
  179.  
  180. ;BREAKが押された
  181. 2:    bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  182.     bsr    do_mute            ;muteする
  183.     st.b    break_aborted
  184.     move.w    $0A0E.w,abort_iocs_in_progress
  185.     IOCS    _ABORTRST
  186.     IOCS    _ABORTJOB
  187.     rte                ;ダミー
  188.  
  189. ;CTRLが押された
  190. 3:    st.b    ctrl_down
  191.     bra    99b
  192.  
  193. ;CTRLが離された
  194. 4:    sf.b    ctrl_down
  195.     bra    99b
  196.  
  197. ;Cが押された
  198. 5:    tst.b    ctrl_down
  199.     beq    99b
  200.     bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  201.     bsr    do_mute            ;muteする
  202.     st.b    ctrlc_aborted
  203.     move.w    $0A0E.w,abort_iocs_in_progress
  204.     IOCS    _ABORTRST
  205.     IOCS    _ABORTJOB
  206.     rte                ;ダミー
  207.  
  208. ;Fが押された
  209. 6:    st.b    fadeout_requested
  210.     bra    99b
  211.  
  212. ;TABが押された
  213. 7:    bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  214.     bsr    do_mute            ;muteする
  215.     st.b    tab_aborted
  216.     bra    99b            ;すぐにはアボートしない
  217.  
  218. ;Qが押された
  219. 8:    bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  220.     bsr    do_mute            ;muteする
  221.     move.b    #-2,esc_aborted
  222.     bra    99b            ;すぐにはアボートしない
  223.  
  224. ;COPYが押された
  225. 15:    bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  226.     bsr    do_mute            ;muteする
  227.   .if NMI_PC
  228.     move.l    (4+2,sp),nmi_pc        ;スタック注意
  229.   .endif
  230.     bra    nmi_routine_proc    ;INTERRUPTとして処理する
  231.  
  232.     .data
  233.     .align    4
  234. keyin_full_old_vector::    .dc.l    0
  235.  
  236.     .data
  237. esc_aborted::        .dc.b    0    ;-1=ESCが押された,-2=Qが押された
  238. break_aborted::        .dc.b    0    ;-1=BREAKが押された
  239. ctrlc_aborted::        .dc.b    0    ;-1=CTRL+Cが押された
  240. ctrl_down:        .dc.b    0    ;-1=CTRLキーが押されている
  241. fadeout_requested::    .dc.b    0    ;-1=フェードアウトの要求があった
  242. tab_aborted::        .dc.b    0    ;-1=TABが押された
  243.  
  244. ;----------------------------------------------------------------
  245. ;muteする
  246. ;    スーパーバイザモードで呼び出すこと
  247.     .text
  248.     .align    4,$2048
  249. do_mute:
  250.     movem.l    d0-d1/a0-a1,-(sp)
  251.     lea.l    OPMADR,a0
  252.     lea.l    (OPMDAT-OPMADR,a0),a1
  253.     moveq.l    #$78,d0
  254.     moveq.l    #4-1,d1
  255.     tst.b    mono_play_flag
  256.     bne    @f
  257.     moveq.l    #8-1,d1
  258. @@:
  259. 1:    bsr    70f
  260.     move.b    d0,(a0)
  261.     bsr    70f
  262.     move.b    #ZERO_TL,(a1)
  263.     addq.b    #1,d0
  264.     dbra    d1,1b
  265.     bsr    70f
  266.     movem.l    (sp)+,d0-d1/a0-a1
  267.     rts
  268.  
  269. 70:    nop
  270.     nop
  271. @@:    tst.b    (a1)
  272.     bmi    @b
  273.     rts
  274.  
  275. ;----------------------------------------------------------------
  276. ;キー入力割り込みルーチン(extraモードのとき)
  277. ;    キーマトリクスと操作の状態を更新する.
  278. ;    このルーチンでは,同じボタン操作になるキーを2つ同時に押しているとき,
  279. ;    一方を離すとそのボタンが離されたと認識される.
  280. ;    TIMERD割り込みよりもキー入力割り込みの方が強いので,
  281. ;    TIMERDが重くてもキー入力で中断できる.
  282.     .text
  283.     .align    4,$2048
  284. extra_keyin_full_routine::
  285.     movem.l    d1/a0,-(sp)
  286.     moveq.l    #$01,d1
  287.     add.b    UDR,d1
  288.     beq    10f
  289.     subq.b    #$01,d1
  290.     bmi    1f
  291.   .if TEST_BREAK
  292.     cmp.b    #KEY_CODE_BREAK,d1    ;BREAK
  293.     beq    20f
  294.   .endif
  295.   .if TEST_COPY_INTERRUPT
  296.     cmp.b    #KEY_CODE_COPY,d1    ;COPYはINTERRUPTとみなす
  297.     beq    15f
  298.   .endif
  299.   .if TEST_ESC
  300.     cmp.b    #KEY_CODE_ESC,d1    ;ESC
  301.     beq    30f
  302.   .endif
  303.     lea.l    (key_stat_table,pc),a0
  304.     st.b    (a0,d1.w)
  305.     move.b    (key_mode_table-key_stat_table,a0,d1.w),d1
  306.     or.b    d1,keyin_status
  307. 99:    movem.l    (sp)+,d1/a0
  308.   .if TEST_KEYIN_FULL_OLD
  309.     move.l    extra_keyin_full_old_vector,-(sp)
  310.     rts
  311.   .else
  312.     rte
  313.   .endif
  314. 1:    lea.l    (key_stat_table-128,pc),a0
  315.     sf.b    (a0,d1.w)
  316.     move.b    (key_mode_table-key_stat_table,a0,d1.w),d1
  317.     not.b    d1
  318.     and.b    d1,keyin_status
  319.     movem.l    (sp)+,d1/a0
  320.   .if TEST_KEYIN_FULL_OLD
  321.     move.l    extra_keyin_full_old_vector,-(sp)
  322.     rts
  323.   .else
  324.     rte
  325.   .endif
  326.  
  327. ;キーボードの初期化
  328. ; あまり好ましくないが,IOCSコールで済ませる.
  329. 10:    move.l    d0,-(sp)
  330.     move.b    $0810.w,d1
  331.     IOCS    _LEDCTRL
  332.     move.b    $00ED003A,d1        ;キーリピートのディレイタイム
  333.     IOCS    _KEYDLY
  334.     move.b    $00ED003B,d1        ;キーリピートのインターバル
  335.     IOCS    _KEYREP
  336.     movem.l    (sp)+,d0-d1/a0
  337.     rte
  338.  
  339.   .if TEST_BREAK
  340. ;BREAKが押された
  341. 20:    bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  342.     bsr    do_mute            ;muteする
  343.     st.b    break_aborted
  344.     move.w    $0A0E.w,abort_iocs_in_progress
  345.     IOCS    _ABORTRST
  346.     IOCS    _ABORTJOB
  347.   .endif
  348.  
  349.   .if TEST_ESC
  350. ;ESCが押された
  351. 30:    bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  352.     bsr    do_mute            ;muteする
  353.     st.b    esc_aborted
  354.     bra    99b
  355.   .endif
  356.  
  357.   .if TEST_COPY_INTERRUPT
  358. ;COPYが押された
  359. 15:    bclr.b    #4,IMRB            ;TIMERD割り込み禁止
  360.     bsr    do_mute            ;muteする
  361.     .if NMI_PC
  362.     move.l    (4*2+2,sp),nmi_pc    ;スタック注意
  363.     .endif
  364.     bra    nmi_routine_proc    ;INTERRUPTとして処理する
  365.   .endif
  366.  
  367.     .align    4
  368. key_mode_table:
  369. ;    bit0    Forward        $01    ↑,8
  370. ;    bit1    Backward    $02    ↓,2
  371. ;    bit2    Left        $04    ←,4
  372. ;    bit3    Right        $08    →,6
  373. ;    bit5    Trigger-A(右)    $20    CR,SP,ENTER,XF1,OPT.1
  374. ;    bit6    Trigger-B(左)    $40    ESC,BS,XF2,OPT.2
  375.  
  376. ;        +$00    +$01    +$02    +$03    +$04    +$05    +$06    +$07
  377.  
  378. ;        なし    ESC    1!    2"    3#    4$    5%    6&
  379.     .dc.b    $00,    $40,    $00,    $00,    $00,    $00,    $00,    $00    ;$00+
  380.  
  381. ;        7'    8(    9)    0    -=    ^~    \|    BS
  382.     .dc.b    $00,    $00,    $00,    $00,    $00,    $00,    $00,    $40    ;$08+
  383.  
  384. ;        TAB    Q    W    E    R    T    Y    U
  385.     .dc.b    $00,    $00,    $00,    $00,    $00,    $00,    $00,    $00    ;$10+
  386.  
  387. ;        I    O    P    @`    [{    CR    A    S
  388.     .dc.b    $00,    $00,    $00,    $00,    $00,    $20,    $00,    $00    ;$18+
  389.  
  390. ;        D    F    G    H    J    K    L    ;+
  391.     .dc.b    $00,    $00,    $00,    $00,    $00,    $00,    $00,    $00    ;$20+
  392.  
  393. ;        :*    ]}    Z    X    C    V    B    N
  394.     .dc.b    $00,    $00,    $00,    $00,    $00,    $00,    $00,    $00    ;$28+
  395.  
  396. ;        M    ,<    .>    /?    _    SP    HOME    DEL
  397.     .dc.b    $00,    $00,    $00,    $00,    $00,    $20,    $00,    $00    ;$30+
  398.  
  399. ;        R.UP    R.DOWN    UNDO    ←    ↑    →    ↓    CLR
  400.     .dc.b    $00,    $00,    $00,    $04,    $01,    $08,    $02,    $00    ;$38+
  401.  
  402. ;        /    *    -    7    8    9    +    4
  403.     .dc.b    $00,    $00,    $00,    $00,    $01,    $00,    $00,    $04    ;$40+
  404.  
  405. ;        5    6    =    1    2    3    ENTER    0
  406.     .dc.b    $00,    $08,    $00,    $00,    $02,    $00,    $20,    $00    ;$48+
  407.  
  408. ;        ,    .    記号    登録    HELP    XF1    XF2    XF3
  409.     .dc.b    $00,    $00,    $00,    $00,    $00,    $20,    $40,    $00    ;$50+
  410.  
  411. ;        XF4    XF5    かな    ローマ    コード    CAPS    INS    ひら
  412.     .dc.b    $00,    $00,    $00,    $00,    $00,    $00,    $00,    $00    ;$58+
  413.  
  414. ;        全角    BREAK    COPY    F1    F2    F3    F4    F5
  415.     .dc.b    $00,    $00,    $00,    $00,    $00,    $00,    $00,    $00    ;$60+
  416.  
  417. ;        F6    F7    F8    F9    F10    なし    なし    なし
  418.     .dc.b    $00,    $00,    $00,    $00,    $00,    $00,    $00,    $00    ;$68+
  419.  
  420. ;        SHIFT    CTRL    OPT.1    OPT.2    NUM    なし    なし    なし
  421.     .dc.b    $00,    $00,    $20,    $40,    $00,    $00,    $00,    $00    ;$70+
  422.  
  423. ;        なし    なし    なし    なし    なし    なし    なし    なし
  424.     .dc.b    $00,    $00,    $00,    $00,    $00,    $00,    $00,    $00    ;$78+
  425.  
  426. key_stat_table:        .dcb.b    128,0    ;現在のキーの押し下げ状態
  427.  
  428.     .data
  429. keyin_status:        .dc.b    0    ;現在のキー操作の状態
  430.                     ;    押されているビットが1
  431.                     ;    bit0    Forward
  432.                     ;    bit1    Backward
  433.                     ;    bit2    Left
  434.                     ;    bit3    Right
  435.                     ;    bit5    Trigger-A(右)
  436.                     ;    bit6    Trigger-B(左)
  437.  
  438.   .if TEST_BREAK
  439.     .if 0
  440. break_aborted:        .dc.b    0
  441.     .endif
  442.   .endif
  443.  
  444. ;----------------------------------------------------------------
  445. ;TIMERA割り込みルーチン
  446.     .text
  447.     .align    4,$2048
  448. timera_routine::
  449.   .if TIMERA_INTERVAL>1
  450.     subq.b    #1,timera_interval_counter
  451.     beq    @f
  452.     rte
  453. @@:    move.b    #TIMERA_INTERVAL,timera_interval_counter
  454.   .endif
  455.  
  456.     bclr.b    #5,IERA            ;TIMERA割り込み禁止
  457.  
  458.   .if TEST_ABSOLUTE
  459.     movem.l    d0-d1/a0-a1,-(sp)
  460. ;割り込み許可
  461.     move.w    (4*4,sp),d0        ;割り込む前のsr(スタックオフセット注意)
  462.   .else
  463.     movem.l    d0-d1/a0-a1/a6,-(sp)
  464.     lea.l    base,a6
  465. ;割り込み許可
  466.     move.w    (4*5,sp),d0        ;割り込む前のsr(スタックオフセット注意)
  467.   .endif
  468.  
  469.     or.w    #$2000,d0
  470.     move.w    d0,sr            ;割り込む前の割り込み許可レベルにする
  471.     move.b    #%11011111,ISRA        ;TIMERA割り込みサービス終了宣言
  472.  
  473. ;カウンタを更新する
  474.     tst.w    (timera_fadeout_counter)r
  475.     ble    @f
  476.     subq.w    #1,(timera_fadeout_counter)r
  477. @@:
  478.  
  479.     sf.b    (control_status)r
  480. ;キーボードの状態を記録する
  481.     clr.w    d0
  482.     move.b    (keyin_status)r,d0    ;今回押されているビットが1
  483.     move.b    (key_status)r,d1    ;前回押されていたビットが1
  484.     not.b    d1            ;前回押されていなかったビットが1
  485.     move.b    d0,(key_status)r    ;今回押されているビットが1
  486.     and.b    d1,d0            ;今回押されたビットが1
  487.     beq    @f
  488.     or.b    d0,(control_status)r
  489.     bsr    writeControl
  490. @@:
  491.  
  492. ;パッドの状態を記録する
  493.     move.w    #$01_00,d0
  494.     move.b    JOY1,d0            ;今回押されていないビットが1
  495.     move.b    (joy1_status)r,d1    ;前回押されていたビットが1
  496.     not.b    d0            ;今回押されているビットが1
  497.     not.b    d1            ;前回押されていなかったビットが1
  498.     move.b    d0,(joy1_status)r    ;今回押されているビットが1
  499.     and.b    d1,d0            ;今回押されたビットが1
  500.     beq    @f
  501.     or.b    d0,(control_status)r
  502.     bsr    writeControl
  503. @@:
  504.     move.w    #$02_00,d0
  505.     move.b    JOY2,d0            ;今回押されていないビットが1
  506.     move.b    (joy2_status)r,d1    ;前回押されていたビットが1
  507.     not.b    d0            ;今回押されているビットが1
  508.     not.b    d1            ;前回押されていなかったビットが1
  509.     move.b    d0,(joy2_status)r    ;今回押されているビットが1
  510.     and.b    d1,d0            ;今回押されたビットが1
  511.     beq    @f
  512.     or.b    d0,(control_status)r
  513.     bsr    writeControl
  514. @@:
  515.  
  516. ;マウスの状態を記録する
  517.     move.l    d2,-(sp)
  518.     move.b    (mouse_status)r,d1    ;前回押されていたビットが1
  519.     not.b    d1            ;前回押されていなかったビットが1
  520.     lea.l    $0930.w,a0
  521.     moveq.l    #%00000011,d0
  522.     and.b    (a0)+,d0        ;[$0930.w].b:マウスステータスデータ
  523.                     ;    bit0    左スイッチ(0=OFF,1=ON)
  524.                     ;    bit1    右スイッチ(0=OFF,1=ON)
  525.                     ;    bit4    オーバーフロー(X>127)
  526.                     ;    bit5    オーバーフロー(X<-128)
  527.                     ;    bit6    オーバーフロー(Y>127)
  528.                     ;    bit7    オーバーフロー(Y<-128)
  529.                     ;bit1:マウスの右スイッチ(0=OFF,1=ON)
  530.                     ;→bit6:Trigger-B(左)
  531.                     ;bit0:マウスの左スイッチ(0=OFF,1=ON)
  532.                     ;→bit5:Trigger-A(右)
  533.     add.b    d0,d0            ;bit4
  534.     moveq.l    #$80,d2
  535.     add.b    (a0)+,d2        ;[$0931.w].b:マウスの左右移動量(+右,-左)
  536.                     ;$00~$7F=左,$81~$FF=右
  537.     add.b    #$80-MOUSE_DELTA,d2    ;$80+MOUSE_DELTA~$FFのときcs
  538.     addx.b    d0,d0            ;bit3:右
  539.     sub.b    #$80-MOUSE_DELTA,d2    ;元に戻す
  540.     sub.b    #$80-MOUSE_DELTA,d2    ;$00~$80-MOUSE_DELTAのときcs
  541.     addx.b    d0,d0            ;bit2:左
  542.     moveq.l    #$80,d2
  543.     add.b    (a0)+,d2        ;[$0932.w].b:マウスの上下移動量(+下,-上)
  544.                     ;$00~$7F=上,$81~$FF=下
  545.     add.b    #$80-MOUSE_DELTA,d2    ;$80+MOUSE_DELTA~$FFのときcs
  546.     addx.b    d0,d0            ;bit1:下
  547.     sub.b    #$80-MOUSE_DELTA,d2    ;元に戻す
  548.     sub.b    #$80-MOUSE_DELTA,d2    ;$00~$80-MOUSE_DELTAのときcs
  549.     addx.b    d0,d0            ;bit0:上
  550.     move.b    d0,(mouse_status)r
  551.     and.b    d1,d0            ;今回押されたビットが1
  552.     beq    @f
  553.     or.b    d0,(control_status)r
  554.     or.w    #$03_00,d0
  555.     bsr    writeControl
  556. @@:    move.l    (sp)+,d2
  557.  
  558.   .if TEST_CONTROL
  559.     moveq.l    #%00100000,d0        ;Trigger-A(右)
  560.     and.b    (control_status)r,d0
  561.     bne    1f
  562.     move.w    #$0000,$00E82200
  563.     bra    2f
  564. 1:    move.w    #$003E,$00E82200
  565. 2:
  566.   .endif
  567.  
  568. ;マウスデータを要求する
  569.     moveq.l    #$20,d0
  570. ;    and.b    IMRB,d0
  571.     and.b    IERB,d0
  572.     bne    @f            ;TIMERCが生きているときはスキップ
  573.     movea.l    $09B6.w,a0        ;TIMERCのマウスデータ受信要求処理のアドレス
  574.     jsr    (a0)
  575. @@:
  576.  
  577.   .if TEST_ABSOLUTE
  578.     movem.l    (sp)+,d0-d1/a0-a1
  579.   .else
  580.     movem.l    (sp)+,d0-d1/a0-a1/a6
  581.   .endif
  582.  
  583.     bset.b    #5,IERA            ;TIMERA割り込み許可
  584.     rte
  585.  
  586.     .data
  587.   .if TIMERA_INTERVAL>1
  588. timera_interval_counter:    .dc.b    TIMERA_INTERVAL
  589.   .endif
  590.  
  591. control_status::    .dc.b    0    ;現在の操作の状態
  592.                     ;    押されているビットが1
  593.                     ;    bit0    Forward
  594.                     ;    bit1    Backward
  595.                     ;    bit2    Left
  596.                     ;    bit3    Right
  597.                     ;    bit5    Trigger-A(右)
  598.                     ;    bit6    Trigger-B(左)
  599. key_status:        .dc.b    0
  600. joy1_status:        .dc.b    0
  601. joy2_status:        .dc.b    0
  602. mouse_status:        .dc.b    0
  603.     .even
  604. timera_fadeout_counter::    .dc.w    -1    ;TIMERA割り込みカウンタ
  605.                     ;1以上の正数のときTIMERA割り込みで1ずつ引かれる
  606.  
  607. ;----------------------------------------------------------------
  608. ;操作をバッファに書き込む
  609. ;<d0.w:操作
  610. ;<a6.l:base
  611. ;?a0
  612.     .text
  613.     .align    4,$2048
  614. writeControl::
  615.     cmpi.w    #MAX_CONTROL,(control_count)r
  616.     beq    9f            ;これ以上書き込めない
  617.     addq.w    #1,(control_count)r    ;ライトなので処理の前にカウンタを増やす
  618.     movea.l    (control_write_ptr)r,a0
  619.     move.w    d0,(a0)+
  620.     cmpa.l    #control_record_end,a0
  621.     blo    @f
  622.     lea.l    control_record,a0
  623. @@:    move.l    a0,(control_write_ptr)r
  624. 9:    rts
  625.  
  626. ;----------------------------------------------------------------
  627. ;操作をバッファから読み出す
  628. ;<a6.l:base
  629. ;>d0.w:操作
  630. ;    $00xx    キーボード
  631. ;    $01xx    JOY1
  632. ;    $02xx    JOY2
  633. ;    $03xx    マウス
  634. ;    押されているビットが1
  635. ;    bit0    Forward
  636. ;    bit1    Backward
  637. ;    bit2    Left
  638. ;    bit3    Right
  639. ;    bit5    Trigger-A(右)
  640. ;    bit6    Trigger-B(左)
  641. ;>z-flag:eq=操作なし
  642. ;?a0
  643.     .text
  644.     .align    4,$2048
  645. readControl::
  646.     move.w    (control_count)r,d0
  647.     beq    9f            ;操作がない
  648.     movea.l    (control_read_ptr)r,a0
  649.     move.w    (a0)+,d0
  650.     cmpa.l    #control_record_end,a0
  651.     blo    @f
  652.     lea.l    control_record,a0
  653. @@:    move.l    a0,(control_read_ptr)r
  654.     subq.w    #1,(control_count)r    ;リードなので処理の後にカウンタを減らす
  655.     tst.w    d0
  656. 9:    rts
  657.  
  658. ;----------------------------------------------------------------
  659. ;操作のワーク
  660.     .data
  661.     .even
  662. control_count:        .dc.w    0    ;操作のバッファの中の操作の数
  663.     .align    4
  664. control_read_ptr:    .dc.l    control_record
  665. control_write_ptr:    .dc.l    control_record
  666.     .even
  667.  
  668.     .bss
  669.     .even
  670. control_record:        .dcb.w    MAX_CONTROL,0
  671.                     ;    $00xx    キーボード
  672.                     ;    $01xx    JOY1
  673.                     ;    $02xx    JOY2
  674.                     ;    $03xx    マウス
  675.                     ;    押されているビットが1
  676.                     ;    bit0    Forward
  677.                     ;    bit1    Backward
  678.                     ;    bit2    Left
  679.                     ;    bit3    Right
  680.                     ;    bit5    Trigger-A(右)
  681.                     ;    bit6    Trigger-B(左)
  682. control_record_end:
  683.  
  684.